package cn.sixos.bo;

import java.util.Date;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.sixos.dao.HibernateDao;
import cn.sixos.entity.User;
import cn.sixos.vo.UserVo;

@Service("userBo")
public class UserBo {
	@Resource
	private HibernateDao hibernateDao;

	// 注册
	// 参数：user实体
	// 返回：无
	@Transactional
	public void doSave(User user) {
		// Dao执行保存
		hibernateDao.save(user);
		// 调用发信方法
		//TODO
		// 无返回
	}
	
	//激活用户
	//参数：用户的id
	//返回：无
	@Transactional
	public void doState(Long id){
		//TODO
		//调用dao通过id查询出用户实体
		//更改用户的state状态
	}

	//查询用户ForUpdate
	//参数：用户id
	//返回：UserVo
	@Transactional(readOnly=true)
	public UserVo queryUser(long id){
		//TODO
		//通过id查询出User实体
		//将User实体转换成UserVo
		//返回UserVo
		return null;
	}
	
	//用户修改资料update
	//参数：UserVo
	//返回：无
	@Transactional
	public void doUpdate(UserVo vo){
		//TODO
		//通过UserVo的id查询出User实体
		//将vo copy到实体上
		//执行update
	}
	
	//修改密码
	//参数：UserVo
	//返回：成功则修改密码，失败则返回消息：原密码不匹配
	@Transactional
	public void doChangePassword(UserVo vo){
		//TODO
		//根据vo的id和原密码查询User实体类
		//如果查询失败则抛出异常：原密码不匹配
		//查询成功则将vo的新密码copy给查询出的实体类
		//执行update
	}
	
	//重置密码
	//参数：userName，userEmail
	//返回：成功则发信重置密码，失败则返回消息：用户不存在
	@Transactional
	public void doResetPassword(String userName,String userEmail){
		//TODO
		//根据userName和userEmail查询User实体类
		//如果没有则抛出信息：用户不存在！
		//如果有调用一个随机数方法生成一个6位的数字
		//将数字转换成MD5格式
		//将转换成的新密码set到查询出的User实体
		//对实体update
		//调用发信方法，将新密码发送到user的邮箱去
	}
	
	//未选课查询（条件查询，分页）
	//参数：courseName,teacher,minTime,maxTime,pageNo,pageSize
	//返回：名为result的map(装有voList和page)
	@Transactional(readOnly=true)
	public Map<String,Object> queryNotselected(long id,String courseName, String teacher,
			Date minTime, Date maxTime, Integer pageNo, Integer pageSize){
		//TODO 注意隐含条件，上课时间在当前时间之前的不应该被查询出来
		//组装hql语句
		//组装countHql语句
		// 取符合条件的数据数量
		// 若符合条件的数据数量是0则返回空的结果容器
		// 计算分页数据
		// 查询数据
		// 转换VO
		// 封装结果数据
		// 返回
		return null;
	}
	
		//已选课查询（条件查询，分页）
		//参数：long id
		//返回：名为result的map(装有voList和page)
		@Transactional(readOnly=true)
		public Map<String,Object> querySelected(long id,Integer pageNo, Integer pageSize){
			//TODO 
			//组装hql语句
			//组装countHql语句
			// 取符合条件的数据数量
			// 若符合条件的数据数量是0则返回空的结果容器
			// 计算分页数据
			// 查询数据
			// 转换VO
			// 封装结果数据
			// 返回
			return null;
		}
	
	//选课
	//参数：long id,long... ids(课程的)
	//返回：无
	@Transactional
	public void doSelectCourse(long id,long... ids){
		// 通过user的ID查询学生对象
		// 遍历传来的课程ids
		// 进行课程实体的查询
		// 把课程实体与学生实体关联起来
		// update user
	}
	
	//发送激活邮件方法
	@Transactional
	private static void sendEmail(User user) {
		//TODO
		//参考commons发送邮件方法
	}
	
	//发送新密码邮件方法
	@Transactional
	private static void sendPasswordEmail(User user) {
		//TODO
		//参考commons发送邮件方法
	}
}
